<?php
namespace classlib\database;
use classlib\orm;
abstract class parser {
	/**
     * 参数
     * @var resource
     */
    protected $db = null;
    
    /**
     * 参数
     * @var array
     */
    protected $params;
    
     /**
     * 参数
     * @var array
     */
    protected $options;
    
    /**
     * 构造函数
     * @param $params 数据库连接
     */
    public function __construct($params, $options) {
        $this->params  = $params;
        $this->options = $options;
    }
    
    /**
     * 连接数据库
     * @return 连接失败throw异常
     */
    abstract public function connect();

    /**
     * 解析生成SQL语句
     * @param array $args    OrmQuery生成的SQL元素数组
     * @param array $isprint 是否只是为了输出SQL语句(在PDO模式下才有意义)
     * @return string
     */
    abstract public function parse_sql($args, $isprint=false);
    
    /**
     * 获取一条记录
     * @param string $sql SQL语句
     * @param int $fetchmode 记录提取模式 默认字段名(orm::FETCH_ASSOC)
     * @return array
     */
    abstract public function get_first($sql, $fetchmode = orm::FETCH_ASSOC);
    
    /**
     * 返回所有记录
     * @param string $sql SQL语句
     * @param int $offset 偏移量,即记录起始游标,从0开始
     * @param int $count 返回的最大记录数
     * @param int $fetchMode 记录提取模式 默认字段名(Orm::FETCH_ASSOC)
     * @return array
     */
    abstract public function get_all($sql, $offset=0, $count=-1, $fetchmode = orm::FETCH_ASSOC);
    
    /**
     * 执行SQL(update/delete)并返回受影响的记录数
     * @param string $sql SQL语句
     * @return resource or throw Exception
     */
    abstract public function execute($sql);
    
    /**
     * 执行SQL(update/delete)并返回受影响的记录数
     * @return int
     */
    abstract public function get_affected_rows();
    
    /**
     * 返回最后一条插入行的序列值
     * @return int 最后一条插入行的序列值
     */
    abstract public function last_insert_id();
    
    /**
     * 初始化一个事务
     * @return boolean
     */
    public function begin_transaction() {
    	return false;
    }
    
    /**
     * 提交一个事务
     * @return boolean
     */
    public function commit()  {
    	return false;
    }
    
    /**
     * 回滚一个事务
     * @return boolean
     */
    public function rollback() {
    	return false;
    }
     
     /**
     * 关闭数据连接
     * @return boolean
     */
    abstract public function close();
}